/**
 * @file visual_monitor.h
 * @brief 视觉监测模块（400W摄像头）
 * @version 2.0
 * @date 2023-03-15
 * @note 该模块处理400W摄像头数据，用于辅助拉力传感器测量等效线缆的覆冰厚度
 */

#ifndef VISUAL_MONITOR_H
#define VISUAL_MONITOR_H

#include <stdbool.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

// 图像帧结构体
typedef struct {
    unsigned char *data;   // 图像数据
    int width;             // 图像宽度
    int height;            // 图像高度
    int channels;          // 图像通道数
    size_t size;           // 图像数据大小(字节)
} ImageFrame;

// 视觉监测配置
typedef struct {
    char camera_url[256];      // 摄像头RTSP URL
    char camera_ip[64];        // 摄像头IP地址
    char username[32];         // 用户名
    char password[32];         // 密码
    int width;                 // 图像宽度
    int height;                // 图像高度
    int fps;                   // 帧率
    int timeout_ms;            // 连接超时时间(毫秒)
    bool save_images;          // 是否保存图像
    char image_save_dir[256];  // 图像保存目录
    int save_interval;         // 保存间隔(帧数)
    float cable_diameter;      // 线缆直径(mm)，用于计算覆冰厚度
} VisualMonitorConfig;

// 视觉覆冰数据
typedef struct {
    float thickness;       // 覆冰厚度(mm)
    float coverage_rate;   // 覆冰率(%)
    float ice_area;        // 覆冰面积(平方毫米)
    float cable_diameter;  // 线缆直径(mm)
    long timestamp;        // 时间戳
    ImageFrame latest_frame; // 最新的图像帧
    
    // 新增季节相关视觉特征字段
    uint8_t season_info;   // 季节信息(0=春, 1=夏, 2=秋, 3=冬)
    uint8_t image_quality; // 图像质量(0-100)
    float brightness_factor; // 亮度系数(0.5-1.5)
    float contrast_factor;   // 对比度系数(0.8-1.2)
} VisualIceData;

/**
 * @brief 初始化视觉监测模块
 * 
 * @param config 视觉监测配置
 * @return int 成功返回0，失败返回非0
 */
int init_visual_monitor(VisualMonitorConfig *config);

/**
 * @brief 清理视觉监测模块资源
 */
void cleanup_visual_monitor(void);

/**
 * @brief 获取视觉覆冰数据
 * 
 * @param data 输出的覆冰数据
 * @return int 成功返回0，失败返回非0
 */
int get_visual_ice_data(VisualIceData *data);

/**
 * @brief 获取最新的视觉覆冰数据
 * 
 * @param data 输出的覆冰数据
 * @return int 成功返回0，失败返回非0
 */
int get_latest_visual_ice_data(VisualIceData *data);

/**
 * @brief 启动视觉监测线程
 * 
 * @return int 成功返回0，失败返回非0
 */
int start_visual_monitor_thread(void);

/**
 * @brief 停止视觉监测线程
 * 
 * @return int 成功返回0，失败返回非0
 */
int stop_visual_monitor_thread(void);

#ifdef __cplusplus
}
#endif

#endif /* VISUAL_MONITOR_H */ 